iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 8

被MongoDB用Aggregate暴打的後端小菜雞日記-day8-用$group將資料分組(下)

  • 分享至 

  • xImage
  •  

今天將延續昨天的主題,繼續講可以和$group一起搭配的操作符。

再開始之前,額外提醒一下,前面文章提到的操作符,例如:$max其實可以用在很多地方,不只有在$group裡面,想了解更多使用方式,真的很推薦到MongoDB的官方文件看一下。

接下來進入正題
假設商店有A、B、C三種商品,因為不同的時間點,商店推出不同的折扣優待,所以商品的價格是會有變動的,因此有以下的訂單資料。

  { _id: 1, product: "A", price: 340, category: "3C", date: "2019-01-08T06:12:03Z" },
  { _id: 2, product: "A", price: 500, category: "3C", date: "2019-12-10T06:12:03Z" },
  { _id: 3, product: "A", price: 480, category: "3C", date: "2019-08-19T06:12:03Z" },
  { _id: 4, product: "B", price: 600, category: "食品", date: "2019-07-18T06:12:03Z" },
  { _id: 5, product: "B", price: 720, category: "食品", date: "2019-11-03T06:12:03Z" },
  { _id: 6, product: "B", price: 410, category: "食品", date: "2019-03-01T06:12:03Z" },
  { _id: 6, product: "C", price: 910, category: "文具", date: "2019-02-15T06:12:03Z" }

情境一: 老闆想要計算每一種商品,在2019年被賣出多少次,這時可以使用$count來計算分組後每一組有幾筆資料。

order.aggregate([
  {
    $group: {
      _id: "$product",
      saleTime: { $count: {} }
    }
  }
]);

// 回傳的資料會是
  { _id: "A", saleTime: 3 },
  { _id: "B", saleTime: 3 },
  { _id: "C", saleTime: 1 }

情境二:老闆看到我們幫他算的資料,覺得少了類別,他要對帳很不方便,希望我們幫他加上,這時候就可以使用$first回傳分組資料中,第一筆資料的欄位值,這個操作符很適合用在保留分組後,原本共有的資料欄位。

order.aggregate([
  {
    $group: {
      _id: "$product",
      saleTime: { $count: {} },
      category: { $first: "$category" } // 取得原本category的資料
    }
  }
]);

// 回傳的資料會是
  { _id: "A", saleTime: 3, category: "3C" },
  { _id: "B", saleTime: 3, category: "食品" },
  { _id: "C", saleTime: 1, category: "文具" }

情境三:這時老闆又開了新的需求,希望我們能把每一次交易的時間都寫進去,這時候就可以使用$push把原本分組前每一筆資料的特定欄位,加入陣列內來紀錄。

order.aggregate([
  {
    $group: {
      _id: "$product",
      saleTime: { $count: {} },
      category: { $first: "$category" },
      // push後面會接一個的物件,代表最後會寫入original_data這個陣列的內容
      original_data: { $push: { date: "$date" } }
    }
  }
]);

// 回傳的資料會是
  {
    _id: "A",
    saleTime: 3,
    category: "3C",
    original_data: [
      { date: "2019-01-08T06:12:03Z" },
      { date: "2019-12-10T06:12:03Z" },
      { date: "2019-08-19T06:12:03Z" }
    ]
  },
  {
    _id: "B",
    saleTime: 3,
    category: "食品",
    original_data: [
      { date: "2019-07-18T06:12:03Z" },
      { date: "2019-11-03T06:12:03Z" },
      { date: "2019-03-01T06:12:03Z" }
    ]
  },
  {
    _id: "C",
    saleTime: 1,
    category: "文具",
    original_data: [{ date: "2019-02-15T06:12:03Z" }]
  }

ps.$group介紹了這麼多,其實還有其他操作符沒有介紹到,如果想要再更深入的了解,請參考官方文件

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day7-用$group將資料分組(上)
下一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day9-$lookup將兩個collection的資料合併(上)
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言